﻿# -*- coding: utf-8 -*-
import cherrypy
import sqlalchemy
from sqlalchemy import *
from sqlalchemy.orm import relationship, backref
import db  
from datetime import date
import auth
from index import template
import anketa
from anketa import Anketa

circle_anketa = Table('circle_anketa', db.Base.metadata,
     Column('circle_id', Integer, ForeignKey('circle.id')),
     Column('anketa_id', Integer, ForeignKey('anketa.id'))
)

class Circle(db.Base):

    __tablename__ = 'circle'

    id = Column(Integer, primary_key=True)
    title = Column(String)
    description = Column(String)
    age = Column(String)
    entrance = Column(Integer) #Вступительная работа
    time = Column(String)

    anketas = relationship('Anketa', secondary=circle_anketa, backref='circle')

    def __init__(self, circle_id):
        self.id = circle_id

class CircleController(object):
    @cherrypy.expose
    def preview(self, *args):
        return template(self.view(*args))


    @cherrypy.expose
    def participate(self, anketa_id, circle_id):
        myank = db.session.query(Anketa).filter_by(id=anketa_id).one()
        mycirc = db.session.query(Circle).filter_by(id=circle_id).one()
        myank.circle.append(mycirc)
        db.session.commit()
        raise cherrypy.HTTPRedirect('/circle/preview/')

    @cherrypy.expose
    def departicipate(self, anketa_id, circle_id):
        myank = db.session.query(Anketa).filter_by(id=anketa_id).one()
        new = [circ for circ in myank.circle if int(circ.id) != int(circle_id)]
        myank.circle = new
        db.session.commit()
        raise cherrypy.HTTPRedirect('/circle/preview/')


    @cherrypy.expose
    def view(self, *args):
        result = ''
        if len(args) == 0:
            result += '<b>Cписок кружков</b><br><font color="green">Пожалуйста, записывайтесь только на кружки, которые вы действительно будете посещать!</font><br>'
            if db.SESSION_KEY in cherrypy.session.keys() and cherrypy.session[db.SESSION_KEY]:
                lgn = True
                myank = db.session.query(Anketa).filter(Anketa.username == cherrypy.session[db.SESSION_KEY])[-1]
                if not myank.firstname or not myank.lastname or not myank.grade or not myank.school:
                    ank = False
                else:
                    ank = True
                if not ank:
                    result += '<p><font color = "red">Прежде, чем записаться на кружки, вам необходимо заполнить <a href="/anketa/edit">анкету</a>.</font></p>'
            else:
               lgn = False
            result += '<table border="1" cellspacing="0" cellpadding="3"><tr><td>N</td><td>Название</td><td>Описание</td><td>Время</td><td>Место</td><td>Запись</td><td>Участники</td></tr>\n'
            for row in db.session.query(Circle).all():
                if not lgn:
                    partic = 'сначала <a href="/">залогиньтесь</a>'
                elif not ank:
                    partic = 'сначала заполните <a href="/anketa/edit">анкету</a>'
                elif row.id not in [tmp.id for tmp in myank.circle]:
                    partic = '''<a href="/circle/participate/{0}/{1}">записаться</a>'''.format(myank.id, row.id)
                else:
                    partic = '''записан'''
                    partic += ''' <a href="/circle/departicipate/{0}/{1}">отказаться</a>'''.format(myank.id, row.id)
                details = '<a href="/circle/view/{}">подробнее</a> '.format(row.id)
                if auth.member_of('admin')():     
                    details += '''<a href='/circle/edit/{}'>редактировать</a> 
                    <a href='/circle/delete/{}'>удалить</a>'''.format(row.id, row.id)
                lst = [a.id for a in row.anketas]
                reg = db.session.query(Anketa).filter(Anketa.id.in_(lst)).all()
                if row.id < 1000:
                    place = '<a href="/where">МИОО, м.Спортивная</a>'
                else:
                    place = '<a href="http://sch-int.ru/intel/index.php/contact">"Интеллектуал", м.Славянский бульвар</a>'
                result += '''<tr><td>{0}</td><td>{1}</td><td>{2}</td><td>{3}</td><td>{4}</td><td>{5}</td><td>{6}</td>'''.format(row.id, 
                             row.title, details, row.time, place, partic, str(len(reg)) + ' чел.')
                #if auth.member_of('admin')():     
                #    id = str(row.id)
                #    ank = len(db.session.query(anketa.Anketa).filter(anketa.Anketa.circle_ids.like('%' + id + '%')).all())
                #    ank -= len(db.session.query(anketa.Anketa).filter(anketa.Anketa.circle_ids.like('%1' + id + '%')).all())
                #    result += '[' + str(ank) + ' чел.] '
            result += "</table>"
            return result
        else:
            cp = db.session.query(Circle).get(int(args[0]))
            if cp is None:
                return template('''Такого курса нет в базе данных.''')
            else:
                temp = [''' <h3>{}: {}</h3>
                           {}
                           <br><br>{}
                           <br><br><i>{}</i>
                           <br><br>{}
                           <br>{}
                       <br>''']

            if auth.member_of('admin')():     
                temp += ['<b>Cписок анкет</b><br><table border="1">',
                           '<tr><td>id</td><td></td><td>Фамилия</td><td>Имя</td><td>Класс</td><td>Школа</td><td>Город</td><td>Год заполнения</td><td>E-mail</td><td>ICQ</td><td>Jabber</td><td>vkontakte</td><td>skype</td><td>моб.телефон</td><td>Контактное лицо</td><td>опыт</td><td>языки</td><td>осн.языки</td><td>научил</td><td>Олимпиады по информатике</td><td>олимпиады по математике</td><td>Кружки</td><td>кол-во</td><td>удобное время</td><td>чего не хватает?</td><tr>']
                for row in db.session.query(anketa.Anketa).filter(anketa.Anketa.circle_ids.like('%' + args[0] + '%')).all(): 
                    if row.lastname:
                        temp += ['<tr><td>' + str(row) + '</td></tr>']
                temp += ['</table>']
            lst = [a.id for a in cp.anketas]
            reg = db.session.query(Anketa).filter(Anketa.id.in_(lst)).all()
            partis = "<p>Участники: " + ", ".join([(a.lastname or '')+ ' ' + (a.firstname or '') + ' (' + (a.school or '') + ', ' + (str(a.grade) or '') + ' класс)' for a in reg])    
            return template("".join(temp).format(cp.id, cp.title or '', cp.time or '', cp.description or '', 
                          cp.age or '', cp.entrance or '', partis) + '<br><hr><br>' )


    @cherrypy.expose
    def save(self, **args):
        if auth.member_of('admin')():     
            cp = db.session.query(Circle).get(args['id'])
            if cp is None:
                return template('''Такого курса нет в базе данных.''')
            else:
                (cp.title, cp.description, cp.age, cp.entrance, cp.time) = (args['title'],
                           args['description'], args['age'], args['entrance'], args['time'])
                db.session.commit()
        raise cherrypy.HTTPRedirect('/circle/preview/')


    @cherrypy.expose
    def delete(self, *args):
        if auth.member_of('admin')():     
            cp = db.session.query(Circle).get(args[0])
            if cp is None:
                return template('''Такого курса нет в базе данных.''')
            else:
                db.session.delete(cp)
                db.session.commit()
            raise cherrypy.HTTPRedirect('/circle/view/')


    @cherrypy.expose
    def create(self, id):
        if auth.member_of('admin')():     
            db.session.add(Circle(id))
            try:
                db.session.commit()
                raise cherrypy.HTTPRedirect('/circle/form/' + str(id))
            except sqlalchemy.exc.IntegrityError:
                #circle already exists
                db.session.rollback()
                return template('''Кружок id{} уже существует в базе данных'''.format(id))


    @cherrypy.expose
    def form(self, id):
        if auth.member_of('admin')():     
            cp = db.session.query(Circle).get(id)
            if cp is None:
                return template('''Такого курса нет в базе данных.''')
            else: 
                return template('''<form method=POST action='/circle/save'><table border='0'>
                  <tr><td align='right' valign='top'>ID:</td><td><input type='text' name = 'id' size='10' value='{}'></td></tr>
                  <tr><td align='right' valign='top'>Название:</td><td><input type='text' size='80' name = 'title' value='{}'></td></tr>
                  <tr><td align='right' valign='top'>Описание:</td><td><TEXTAREA name='description' rows='10' cols='80'>{}</TEXTAREA></td></tr>
                  <tr><td align='right' valign='top'>На кого рассчитан:</td><td><input type='text' size='80' name = 'age' value='{}'></td></tr>
                  <tr><td align='right' valign='top'>Что требуется сделать для поступления:</td><td>
                         <TEXTAREA valign='bottom' name='entrance' rows='4' cols='80'>{}</TEXTAREA></td></tr>
                  <tr><td align='right' valign='top'>Время:</td><td><input type='text' size='80' name = 'time' value='{}'></td></tr>
                  <tr><td align='right' valign='top'><input type='submit' value='Сохранить изменения'></td><td></td></tr>
                  </table></form>
                '''.format(cp.id, cp.title or '', cp.description or '', cp.age or '', cp.entrance or '', cp.time or ''))

db.Base.metadata.create_all(db.engine) #create table
